<?php 
defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * 观点系统
 * 
 * @desc    意见反馈、评论评价
 * @version 1.0.0 
 * @author  Jason
 * @date	2017年7月5日 下午4:29:55
 * 
 * @version	2.0.0
 * @date	2017年7月6日 下午3:28:37
 * @desc	评论系统2.0：加可为空主评引用
 * ========================================
 * 	“资源”结构：
 * ----------------------------------------
 * 		子评商家（归属商家）
 * 	主	子评导游（归属导游）
 * 	评	子评路线（归属路线）
 * 	ID	子评感受（归属？？）
 * 		子评其它（可能未归属）
 * 	---------------------------------------
 * 		主评订单（归属订单）
 * 	---------------------------------------
 * 		追评订单（归属主评or订单?）
 * ========================================
 * 
 * ========================================
 * 	二维表结构：
 * ----------------------------------------
 * 	商家	打分	内容	图片	标签 -> 外表关系
 * 	导游	 v 	 x 	 x 	 v 	
 * 	路线	 v 	 x 	 x 	 v 	
 * 	感受	 v 	 x 	 x 	 v 	
 * 	其它	 v 	 x 	 x 	 v 	
 * ----------------------------------------
 * 	主要	冗余	 v 	 v 	 v 主评，也来自外表，以上子评的汇兑
 * 	评论	均值			   source_id & source_group_id/master_id 
 * 	本体	v(计算出)		   Tag关系表附加一分组按，便于快查！
 * ----------------------------------------
 * 	追评	 x 	 v 	 v 	 x 	
 * ========================================
 * 
 * ========================================
 * 	操作流程：
 * ----------------------------------------
 * 	插入：	先插主评（先算分） -> 子评 -> 主评/子评标签
 * 	检索：	主评（再需满足）	如分标签和分别打分（主、子、标）
 * 	平均：	主评的分是算出来的，或曰取出来的
 * 	汇总：	取快键或按 R 统计
 * ========================================
 */
class Mod_opinion extends MY_Model
{
	use models\common\BinaryBitBasedStatus;
	
	protected $table_mapper = [
			'master' => 'opinion',
	];
	
	protected $allowed_fields = [
			'master' => [
					'master_id', 'resource_type', 'resource_id', 
					'source_type', 'source_id', 'target_type', 'target_id', 
					'score', 'content', 'images', 
					'resource_platform', 'resource_version', 
					'status'
			],
	];
	
	public function __construct()
	{
		parent::__construct();
		$this->load->database();
		
		$this->status_bit_config = [
				'master' => [
						'status_bit_length' => 4,
						// sticky	置顶的		adj. 粘的；粘性的
						// unstuck	取消置顶的	adj. 松开的，未粘住的；紊乱的；失灵的
						'status_bit_positive_tags' => ['sticky', 'check_over', 'checked', 'enabled'],
						'status_bit_negative_tags' => ['unstuck', 'check_doing', 'unchecked', 'disabled'],
				],
		];
	}
	
	/**
	 * 插入前处理器
	 * 
	 * @param array  $data
	 * @param string $mapping	表映射
	 * 
	 * @return array
	 */
	public function before_create_data_handler($data, $mapping = 'master')
	{
		if ($mapping == 'master') {
			if (isset($data['status_tags'])) {
				if (empty($data['status_tags'])) {
					$data['status_tags'] = [];
				} else if (!is_array($data['status_tags'])) {
					$data['status_tags'] = explode(',', $data['status_tags']);
				}
				$data['status'] = $this->calculate_status_by_tags($data['status_tags']);;
			} else if (!isset($data['status'])) {
				// 默认启用，未审核，未置顶
				$data['status'] = 1;
			}
		}
		
		return $data;
	}
	
	/**
	 * 更新前处理器
	 * 
	 * @desc  主要负责格式化一些字段 & 过滤掉多语言字段，确保只在默认语言下更改主表的多语言字段
	 * @param number $id
	 * @param array  $data
	 * @param string $mapping	表映射
	 * 
	 * @return array
	 */
	public function before_update_data_handler($id, $data, $mapping = 'master')
	{
		if ($mapping == 'master') {
			if (isset($data['status_tags'])) {
				if (empty($data['status_tags'])) {
					$data['status_tags'] = [];
				} else if (!is_array($data['status_tags'])) {
					$data['status_tags'] = explode(',', $data['status_tags']);
				}
				$data['status'] = $this->calculate_status_by_tags($data['status_tags']);;
			}
		}
		
		return $data;
	}
	
	public function has_opinion_exists($resource)
	{
// 		'master_id', 'resource_type', 'resource_id',
// 		'source_type', 'source_id', 'target_type', 'target_id',
		$conditions = [
				['select', 'id'],
				['where', [$resource]],
				['limit', 1],
		];
		$opinions = $this->select_instances_by_conditions($conditions);
		// TODO test select_count_by_conditions
		var_dump($this->select_count_by_conditions($conditions));;
		$opinion = array_pop($opinions);
		
		
		$has = !empty($opinions);
		return [$has, $opinion];
	}
	
	// TODO may be there is a function about to calculate slave AVG
	
}